{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Outliers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "hourly_traffic = [\n",
    "    120, 123, 124, 119, 196, \n",
    "    121, 118, 117, 500, 132\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1    False\n",
       "2    False\n",
       "3    False\n",
       "4    False\n",
       "5    False\n",
       "6    False\n",
       "7    False\n",
       "8     True\n",
       "9    False\n",
       "dtype: bool"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series(hourly_traffic) > pd.Series(hourly_traffic).quantile(0.95)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class PercentileDetection:\n",
    "    \n",
    "    def __init__(self, percentile=0.9):\n",
    "        self.percentile = percentile\n",
    "        \n",
    "    def fit(self, x, y=None):\n",
    "        self.threshold = pd.Series(x).quantile(self.percentile)\n",
    "        \n",
    "    def predict(self, x, y=None):\n",
    "        return (pd.Series(x) > self.threshold).values\n",
    "    \n",
    "    def fit_predict(self, x, y=None):\n",
    "        self.fit(x)\n",
    "        return self.predict(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, False, False, False, False, False,  True,\n",
       "       False])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "outlierd = PercentileDetection(percentile=0.9)\n",
    "outlierd.fit_predict(hourly_traffic)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "    #T_d444aa82_c5d0_11ea_8468_784f43517922row0_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row0_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row1_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row1_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row2_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row2_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row3_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row3_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row4_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row4_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row5_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row5_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row6_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row6_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row7_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row7_col1 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row8_col0 {\n",
       "            font-weight:  bold;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row8_col1 {\n",
       "            font-weight:  bold;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row9_col0 {\n",
       "            font-weight:  normal;\n",
       "        }    #T_d444aa82_c5d0_11ea_8468_784f43517922row9_col1 {\n",
       "            font-weight:  normal;\n",
       "        }</style><table id=\"T_d444aa82_c5d0_11ea_8468_784f43517922\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >hourly_traffic</th>        <th class=\"col_heading level0 col1\" >is_outlier</th>    </tr></thead><tbody>\n",
       "                <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row0_col0\" class=\"data row0 col0\" >120</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row0_col1\" class=\"data row0 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row1_col0\" class=\"data row1 col0\" >123</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row1_col1\" class=\"data row1 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row2_col0\" class=\"data row2 col0\" >124</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row2_col1\" class=\"data row2 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row3_col0\" class=\"data row3 col0\" >119</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row3_col1\" class=\"data row3 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row4_col0\" class=\"data row4 col0\" >196</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row4_col1\" class=\"data row4 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row5_col0\" class=\"data row5 col0\" >121</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row5_col1\" class=\"data row5 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row6_col0\" class=\"data row6 col0\" >118</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row6_col1\" class=\"data row6 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row7_col0\" class=\"data row7 col0\" >117</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row7_col1\" class=\"data row7 col1\" >False</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row8\" class=\"row_heading level0 row8\" >8</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row8_col0\" class=\"data row8 col0\" >500</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row8_col1\" class=\"data row8 col1\" >True</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_d444aa82_c5d0_11ea_8468_784f43517922level0_row9\" class=\"row_heading level0 row9\" >9</th>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row9_col0\" class=\"data row9 col0\" >132</td>\n",
       "                        <td id=\"T_d444aa82_c5d0_11ea_8468_784f43517922row9_col1\" class=\"data row9 col1\" >False</td>\n",
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x7f907b0c66a0>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "outlierd = PercentileDetection(percentile=0.95)\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'hourly_traffic': hourly_traffic,\n",
    "        'is_outlier': outlierd.fit_predict(hourly_traffic)\n",
    "    }\n",
    ").style.apply(\n",
    "    lambda row: ['font-weight: bold'] * len(row) \n",
    "        if row['is_outlier'] == True \n",
    "        else ['font-weight: normal'] * len(row),\n",
    "    axis=1\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# KDD Cup 99"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_kddcup99\n",
    "\n",
    "data = fetch_kddcup99(subset='http')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = data['data']\n",
    "y = data['target'] != b'normal.'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Synth Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_classification\n",
    "\n",
    "x, y = make_classification(\n",
    "    n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, \n",
    "    n_classes=2, n_clusters_per_class=2, weights=[0.98, ], class_sep=0.5, \n",
    "    scale=1.0, shuffle=True, flip_y=0, random_state=0\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1000, 2), (1000,))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Anomalous Traffic: 2.00%\n"
     ]
    }
   ],
   "source": [
    "print(f'% of Anomalous Traffic: {y.mean():.2%}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# from sklearn.model_selection import train_test_split\n",
    "\n",
    "# x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mdJSrn6ZMeZ/jTFjPZ491BjzHWPMYGNMcBfvWURERETkuCjoFoH3gJtobp6WAyyhuXP2hZZlFbV57V9pLnf+Sw+fdT9wLrCX5iDTJ5ZlHaW5q3cR8HrLONNo3u98uOU1m4D/pTkjX0hzoO7tXi/SnDX/Oc170D8FpgJNXQzjmZZn5bY8exhwrecZ3ZZlvQ0soDkAzgBuoLnM3PP57cZpWZaT5g7o42hu6vYy8GfXe2tRClxLc6f13cAfgccty/pby32zae56Hgp8QHMw/leaqxLKWu6xmuas/Ds0z//vu3jPIiIiIiLHxXRchSkibRlj/ghcaVnWxJM9FhERERER6f+0p1vEB8aYcGA8zXuY2x4TJiIiIiIi4pXKy0V88ybNZdhvAK+c5LGIiIiIiMgpQuXlIiIiIiIiIn1EmW4RERERERGRPnJK7OkuLy9XOl5ERE4p4eHh5mSP4XSg3wFERORU4u3//8p0i4iIiIiIiPQRBd0iIiIiIiIifURB92kmNzf3ZA/htKL57H2a096nOe1dmk85FenntvdpTnuX5rP3aU57X1/NqYJuERERERERkT6ioFtERERERESkjyjoFhEREREREekjCrpFRERERERE+oiCbhEREREREZE+oqBbREREREREpI8o6BYRERERERHpIwq6RURERERERPqIgm4RERERERGRPqKgW0RERERERKSPKOgWERERERER6SMKukVE5KRxOBxYlnWyhyEiIiLSZ/xP9gBEROTbx+l08uqrr/LVV18RGhrKjBkzSExMPNnDEhEREel1ynSLiMgJl5GRwaZNm7jrrrtITExk5cqVOJ3Okz0sERERkV6nTLeIiJxwO3fuJC4ujoSEBEJDQ9m4cSNlZWUMGjToZA9NREREpFcp0y0iIh3qqz3XDQ0NBAQEABAcHAxATU1Nrz9HRERE5GRTpltERNrp6z3XdrudiooK4N/BdlBQUK/dX0RERKS/UKZbRETa6es91ykpKeTn55OTk8NHH31EdHQ0kZGRvXZ/ERERkf5CmW4REWmnr/dcp6amMnnyZJ599llCQkKYOXMmNtuJWwd2OBzYbDaMMSfsmSIiIvLtpKBbRETa6WjPdW8F3TabjZtuuokbbrjhhAa/OqpMRERETjSVl4uISDt2u536+nqgb/dc+/n5ndBss44qExERkRNNQbeIiLRzuu65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HyY9PZ01a9YQFxfH0qVL+fGPf0xISAjR0dFcfvnllJaWuvdgu4LLN954g6+++orHH3+clJQU/vznP9PU1ARAYWEh33zzDbNnzyY0NJRdu3Zhs9lYvXo1RUVF7Nu3j6effpra2tpWJfKec7d582YWLVrErFmzGD58uDuz3pvalqV3dz/28Zani4iIiMjJ1Z8y3T7Jzc092UPo9zRHvas/z+f69esZOHAgAHv27OGNN96goKCAadOmERYWxrp161i7di07duzAz8+PY8eOubuCe/Pxxx8zYsQIJk6cyOWXX87cuXOx2WzU19cTFxdHXV0dhw8fpri4mODgYGJiYggODmb48OFYlkV5eTmZmZkUFBTQ2NhIbm4uAwcOpL6+nltvvRWHw8H555/P3r17KSoqorGxkR07dhASEkJ9fT0FBQXk5uZy9OhRd5l7eXk5q1evJiUlhc8++4xPPvmEUaNGsX37dgYPHsyf//xnjh49SkNDA9OmTWPixIn4+/szffp0CgsLWbJkCYcPH6a2ttbr3NlsNsaNG8e6devYsmULERERffqZdVfbz3HAgAEUFRW1+xz788/pqain8xkfH9/LIxFP+jnvnOan92lOe5fms/dpTntfT+a0q///n3JBt36h6Vxubq7mqBf19/mMjIwkODiYuro6CgsLmTBhAmeddRYbN25k3rx5VFRU8NZbb1FQUMDAgQP5xz/+wfTp0zvsuu0qy46IiCAlJcW9jzopKQmbzcaIESNISUnhn//8JyNGjGDYsGEUFRUxePBgwsPDCQ8PJykpifz8fEpLS4mPj2fv3r0EBATw9NNPs3TpUnbv3s24ceMYPHgwFRUVLFu2jICAAMLDw6mrq8PpdJKfn094eDgVFRVERkayb98+duzYgcPhICwsjPj4eAICAggLC6OkpIRzzjmH7du3c/DgQc444wwCAgKw2+0cOnSI+Ph4zj333HYl3a65i4+PZ/DgwYSFhREbG8uIESNO1Mfnk3HjxlFRUcHbb79NSEgId9xxR7uMfH//OT3VaD77L30uHdPPbe/TnPYuzWfv05z2vr6a035TXi7ybeBwOLAsq9eud5Ue79y5k9jYWMLDw92dvCsqKrjpppv41a9+xejRo5k3bx7l5eXMmjWLBx980N3V23VPV5l4VlYWK1asYM2aNVRUVBAcHExkZCSVlZUAzJkzhyuv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\n",
      "text/plain": [
       "<Figure size 1080x504 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 2, figsize=(15, 7), sharex=True, sharey=True)\n",
    "\n",
    "for i, yval in enumerate(np.unique(y)):\n",
    "    \n",
    "    pd.DataFrame(x, columns=['x1', 'x2'])[\n",
    "        y == yval\n",
    "    ].plot(\n",
    "        title=f'Synthetic Dataset',\n",
    "        kind='scatter',\n",
    "        x='x1', y='x2',\n",
    "        color='k',\n",
    "        marker=f'${yval}$',\n",
    "        s=44,\n",
    "        alpha=0.5,\n",
    "        ax=axs[0]\n",
    "    )\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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X3xxrr/++lx88cV9RwEAgMHaVOd0V9X3JNndWvvB9ePO54LxmZqaeuj7ysrKQ9+TPPQdOHHO6R4P2wDQDed0Qze2wjnde5L8yvGesLy8fJKiwHA99rGPzR133JFktWg/eN/7C06MDdhu+RsF4+U9BeOx0fr/pOzprqr3JznzGA+9trX27rXnvDbJ05N8bzsqlE+5YXzMXg4nhz3d42EbALphTzd0o7c93a215x7v8ar610lemOTbji7cwHhNTU2ltfZQ2X7EIx6R00477aHDzgEAgPHpfSK1qnpBkh9P8l2ttXv6zgND95nPfCZvfOMbc84552Tbtm0555xz8sY3vjGf+cxn+o4GAACDsxnO6f7FJDuSvK+qkuSPWmuv6DcSDNfMzEzOOuusHDhw4KFDyxYXFzMzM9N3NAAAGJzeS3dr7Zy+M8Ak2bt3b+bm5jI/P58zzjgji4uLmZuby6WXXtp3NAAAGJzeSzdwcu3evTvXXHNNXvziF6e1lqrKs5/97OzevbvvaAAAMDi9n9MNnFyvec1rcv311+fyyy9/2PfXvOY1fUcDAIDBUbphwrztbW/L61//+rzyla/MIx/5yLzyla/M61//+rztbW/rOxoAAAyO0g0T5r777suePXseNrZnz57cd999PSUCAIDhck43TJgdO3bkVa96VT784Q9naWkpMzMzOe+887Jjx46+owEAwOAo3TBhLrjggvzqr/5qpqam0lrLpz/96Xz0ox/Nc57znL6jAQDA4Di8HCbM0tJSTjvttNx9991preXuu+/OaaedlqWlpb6jAQDA4CjdMGFuu+22vOIVr8g555yTbdu25ZxzzskrXvGK3HbbbX1HAwCAwVG6YQJdddVVD9vTfdVVV/UdCQAABknphgmzbdu23HXXXfn85z+f1lo+//nP56677sq2bf4cAADAuJlIDSbMkSNHkiS33377Q99ba2mt9RkLAAAGya4tmEDbt2/PAw88kCR54IEHsn27z98AAKALSjdMoMOHD2fPnj35wAc+kD179uTw4cN9RwIAgEGyewsm0Kmnnpr3v//9eetb35rHP/7xOfXUU3P//ff3HQsAAAbHnm6YQKeeeupx7wMAAOOhdMOE2b59+0OTqT04edqRI0ec1w0AAB1QumHCXHTRRbn33nvzqU99Kq21fOpTn8q9996biy66qO9oAAAwOEo3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\n",
      "text/plain": [
       "<Figure size 1080x864 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(x.shape[1], 2, figsize=(15, 12), sharey=True)\n",
    "\n",
    "for i in range(x.shape[1]):\n",
    "    \n",
    "    pd.DataFrame(x)[\n",
    "        y == 0\n",
    "    ][i].plot(\n",
    "        title=f'Feature#{i} @ Y = 0',\n",
    "        kind='box',\n",
    "        whis=(2, 98),\n",
    "        color='k',\n",
    "        grid=True,\n",
    "        ax=axs[i][0]\n",
    "    )\n",
    "    \n",
    "    pd.DataFrame(x)[\n",
    "        y == 1\n",
    "    ][i].plot(\n",
    "        title=f'Feature#{i} @ Y = 1',\n",
    "        kind='box',\n",
    "        whis=(2, 98),\n",
    "        color='k',\n",
    "        grid=True,\n",
    "        ax=axs[i][1]\n",
    "    )\n",
    "    \n",
    "    axs[i][0].set_xlabel(f'Feature#{i}')\n",
    "    axs[i][1].set_xlabel(f'Feature#{i}')\n",
    "    \n",
    "    axs[i][0].set_ylabel(f'Feature Values')\n",
    "    axs[i][1].set_ylabel(f'Feature Values')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Percentile Detection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class PercentileDetection:\n",
    "    \n",
    "    def __init__(self, percentile=0.9):\n",
    "        self.percentile = percentile\n",
    "        \n",
    "    def fit(self, x, y=None):\n",
    "        self.threshold = pd.Series(x).quantile(self.percentile)\n",
    "        \n",
    "    def predict(self, x, y=None):\n",
    "        return (pd.Series(x) > self.threshold).values\n",
    "    \n",
    "    def fit_predict(self, x, y=None):\n",
    "        self.fit(x)\n",
    "        return self.predict(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Threshold: 0.96, 2.00%\n"
     ]
    }
   ],
   "source": [
    "outlierd = PercentileDetection(percentile=0.98)\n",
    "y_pred = outlierd.fit_predict(x[:,0])\n",
    "\n",
    "print(\n",
    "    f'Threshold: {outlierd.threshold:.2f}, {y_pred.mean():.2%}'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 5.00%, Recall: 5.00% [Percentile Detection]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [Percentile Detection]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Threshold: 1.82, 2.00%\n"
     ]
    }
   ],
   "source": [
    "outlierd = PercentileDetection(percentile=0.98)\n",
    "y_pred = outlierd.fit_predict(x[:,1])\n",
    "\n",
    "print(\n",
    "    f'Threshold: {outlierd.threshold:.2f}, {y_pred.mean():.2%}'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 0.00%, Recall: 0.00% [Percentile Detection]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [Percentile Detection]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "class PercentileDetection:\n",
    "    \n",
    "    def __init__(self, percentile=0.9):\n",
    "        self.percentile = percentile\n",
    "        \n",
    "    def fit(self, x, y=None):\n",
    "        self.thresholds = [\n",
    "            pd.Series(x[:,i]).quantile(self.percentile)\n",
    "            for i in range(x.shape[1])\n",
    "        ]\n",
    "        \n",
    "    def predict(self, x, y=None):\n",
    "        return (x > self.thresholds).max(axis=1)\n",
    "    \n",
    "    def fit_predict(self, x, y=None):\n",
    "        self.fit(x)\n",
    "        return self.predict(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "outlierd = PercentileDetection(percentile=0.98)\n",
    "y_pred = outlierd.fit_predict(x) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Anomalous Traffic: 2.00%, Detected As Anomalous 2.50%\n"
     ]
    }
   ],
   "source": [
    "print(f'% of Anomalous Traffic: {y.mean():.2%}, Detected As Anomalous {y_pred.mean():.2%}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 4.00%, Recall: 5.00% [Percentile Detection]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [Percentile Detection]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Elliptic Envelope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.covariance import EllipticEnvelope\n",
    "\n",
    "ee = EllipticEnvelope(random_state=0)\n",
    "y_pred = ee.fit_predict(x) == -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Anomalous Traffic: 2.00%, Detected As Anomalous 10.00%\n"
     ]
    }
   ],
   "source": [
    "print(f'% of Anomalous Traffic: {y.mean():.2%}, Detected As Anomalous {y_pred.mean():.2%}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 9.00%, Recall: 45.00% [LocalOutlierFactor]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Local Outlier Factor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import LocalOutlierFactor\n",
    "\n",
    "lof = LocalOutlierFactor(n_neighbors=50)\n",
    "y_pred = lof.fit_predict(x) == -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Anomalous Traffic: 2.00%, Detected As Anomalous 5.00%\n"
     ]
    }
   ],
   "source": [
    "print(f'% of Anomalous Traffic: {y.mean():.2%}, Detected As Anomalous {y_pred.mean():.2%}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 26.00%, Recall: 65.00% [LocalOutlierFactor]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1000.000000\n",
       "mean       -1.108791\n",
       "std         0.280413\n",
       "min        -4.862432\n",
       "25%        -1.108732\n",
       "50%        -1.030691\n",
       "75%        -0.993094\n",
       "max        -0.955223\n",
       "dtype: float64"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series(lof.negative_outlier_factor_).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LOF: Precision: 80.00%, Recall: 40.00% [Quantile=1%]\n",
      "LOF: Precision: 50.00%, Recall: 50.00% [Quantile=2%]\n",
      "LOF: Precision: 14.00%, Recall: 70.00% [Quantile=10%]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "lof = LocalOutlierFactor(n_neighbors=50)\n",
    "lof.fit(x)\n",
    "\n",
    "for quantile in [0.01, 0.02, 0.1]:\n",
    "    \n",
    "    y_pred = lof.negative_outlier_factor_ < np.quantile(\n",
    "        lof.negative_outlier_factor_, quantile\n",
    "    ) \n",
    "    \n",
    "    print(\n",
    "        'LOF: Precision: {:.02%}, Recall: {:.02%} [Quantile={:.0%}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            quantile\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 25.00%, Recall: 65.00% [LocalOutlierFactor; p=1]\n",
      "Precision: 26.00%, Recall: 65.00% [LocalOutlierFactor; p=2]\n",
      "Precision: 24.53%, Recall: 65.00% [LocalOutlierFactor; p=100]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "for p in [1, 2, 100]:\n",
    "    \n",
    "    lof = LocalOutlierFactor(n_neighbors=50, p=p)\n",
    "    y_pred = lof.fit_predict(x) == -1 \n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; p={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            p\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 12.90%, Recall: 40.00% [LocalOutlierFactor; p=1]\n",
      "Precision: 12.90%, Recall: 40.00% [LocalOutlierFactor; p=2]\n",
      "Precision: 13.79%, Recall: 40.00% [LocalOutlierFactor; p=100]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "for p in [1, 2, 100]:\n",
    "    \n",
    "    lof = LocalOutlierFactor(n_neighbors=3, p=p)\n",
    "    y_pred = lof.fit_predict(x) == -1 \n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; p={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            p\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 80.00%, Recall: 40.00% [LocalOutlierFactor; contamination=0.01]\n",
      "Precision: 60.00%, Recall: 60.00% [LocalOutlierFactor; contamination=0.02]\n",
      "Precision: 28.00%, Recall: 70.00% [LocalOutlierFactor; contamination=0.05]\n",
      "Precision: 15.00%, Recall: 75.00% [LocalOutlierFactor; contamination=0.1]\n",
      "Precision: 7.50%, Recall: 75.00% [LocalOutlierFactor; contamination=0.2]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "for contamination in [0.01, 0.02, 0.05, 0.1, 0.2]:\n",
    "    \n",
    "    lof = LocalOutlierFactor(n_neighbors=10, contamination=contamination)\n",
    "    y_pred = lof.fit_predict(x) == -1\n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; contamination={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            contamination\n",
    "        )\n",
    "    )\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 2.23%, Recall: 25.00% [LocalOutlierFactor; n_neighbors=1]\n",
      "Precision: 44.83%, Recall: 65.00% [LocalOutlierFactor; n_neighbors=10]\n",
      "Precision: 32.50%, Recall: 65.00% [LocalOutlierFactor; n_neighbors=20]\n",
      "Precision: 25.00%, Recall: 65.00% [LocalOutlierFactor; n_neighbors=50]\n",
      "Precision: 14.10%, Recall: 55.00% [LocalOutlierFactor; n_neighbors=100]\n",
      "Precision: 8.77%, Recall: 50.00% [LocalOutlierFactor; n_neighbors=200]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "for n_neighbors in [1, 10, 20, 50, 100, 200]:\n",
    "    \n",
    "    lof = LocalOutlierFactor(n_neighbors=n_neighbors, p=1)\n",
    "    y_pred = lof.fit_predict(x) == -1\n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; n_neighbors={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            n_neighbors\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Novelty LOF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import LocalOutlierFactor\n",
    "\n",
    "x_inliers = x[y==0]\n",
    "\n",
    "lof = LocalOutlierFactor(n_neighbors=50, novelty=True)\n",
    "lof.fit(x_inliers)\n",
    "y_pred = lof.predict(x) == -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Anomalous Traffic: 2.00%, Detected As Anomalous 4.90%\n"
     ]
    }
   ],
   "source": [
    "print(f'% of Anomalous Traffic: {y.mean():.2%}, Detected As Anomalous {y_pred.mean():.2%}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 26.53%, Recall: 65.00% [LocalOutlierFactor]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Isolation Forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import IsolationForest\n",
    "\n",
    "iforest = IsolationForest(n_estimators=200, n_jobs=-1, random_state=10)\n",
    "y_pred = iforest.fit_predict(x) == -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Anomalous Traffic: 2.00%, Detected As Anomalous 18.50%\n"
     ]
    }
   ],
   "source": [
    "print(f'% of Anomalous Traffic: {y.mean():.2%}, Detected As Anomalous {y_pred.mean():.2%}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 6.49%, Recall: 60.00% [LocalOutlierFactor]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "print(\n",
    "    'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor]'.format(\n",
    "        precision_score(y, y_pred, pos_label=1),\n",
    "        recall_score(y, y_pred, pos_label=1),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 6.35%, Recall: 60.00% [LocalOutlierFactor; bootstrap=False]\n",
      "Precision: 5.83%, Recall: 65.00% [LocalOutlierFactor; bootstrap=True]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import IsolationForest\n",
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "bootstrap_options = [False, True]\n",
    "\n",
    "for bootstrap_option in bootstrap_options:\n",
    "    \n",
    "    iforest = IsolationForest(n_estimators=200, bootstrap=bootstrap_option, n_jobs=-1)\n",
    "    y_pred = iforest.fit_predict(x) == -1\n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; bootstrap={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            bootstrap_option\n",
    "        )\n",
    "    )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 10.00%, Recall: 5.00% [LocalOutlierFactor; Quantile=0.01]\n",
      "Precision: 5.00%, Recall: 5.00% [LocalOutlierFactor; Quantile=0.02]\n",
      "Precision: 10.00%, Recall: 25.00% [LocalOutlierFactor; Quantile=0.05]\n",
      "Precision: 9.00%, Recall: 45.00% [LocalOutlierFactor; Quantile=0.1]\n",
      "Precision: 6.00%, Recall: 60.00% [LocalOutlierFactor; Quantile=0.2]\n",
      "Precision: 3.20%, Recall: 80.00% [LocalOutlierFactor; Quantile=0.5]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import IsolationForest\n",
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "iforest = IsolationForest(n_jobs=-1)\n",
    "iforest.fit(x)\n",
    "\n",
    "for quantile in [0.01, 0.02, 0.05, 0.1, 0.2, 0.5]:\n",
    "    \n",
    "    anomaly_score = iforest.decision_function(x)\n",
    "    y_pred = anomaly_score < np.quantile(anomaly_score, quantile)\n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; Quantile={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            quantile\n",
    "        )\n",
    "    )\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 10.00%, Recall: 5.00% [LocalOutlierFactor; contamination=0.01]\n",
      "Precision: 10.00%, Recall: 25.00% [LocalOutlierFactor; contamination=0.05]\n",
      "Precision: 11.00%, Recall: 55.00% [LocalOutlierFactor; contamination=0.1]\n",
      "Precision: 6.50%, Recall: 65.00% [LocalOutlierFactor; contamination=0.2]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import IsolationForest\n",
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "for contamination in [0.01, 0.05, 0.1, 0.2]:\n",
    "    \n",
    "    iforest = IsolationForest(contamination=contamination, n_jobs=-1)\n",
    "    y_pred = iforest.fit_predict(x) == -1\n",
    "    \n",
    "    print(\n",
    "        'Precision: {:.02%}, Recall: {:.02%} [LocalOutlierFactor; contamination={}]'.format(\n",
    "            precision_score(y, y_pred, pos_label=1),\n",
    "            recall_score(y, y_pred, pos_label=1),\n",
    "            contamination\n",
    "        )\n",
    "    )\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
